package com.zzw.system.service.Impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.zzw.common.utils.RouterHelper;
import com.zzw.model.system.SysMenu;
import com.zzw.model.system.SysRoleMenu;
import com.zzw.vo.system.AssginMenuVo;
import com.zzw.vo.system.RouterVo;
import com.zzw.system.exception.zzwException;
import com.zzw.system.mapper.SysMenuMapper;
import com.zzw.system.mapper.SysRoleMenuMapper;
import com.zzw.system.service.SysMenuService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zzw.common.utils.MenuHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

import static com.zzw.common.result.ResultCodeEnum.NODE_ERROR;

/**
 * <p>
 * 菜单表 服务实现类
 * </p>
 *
 * @author zzw
 * @since 2023-04-21
 */

@Service
public class SysMenuServiceImpl extends ServiceImpl<SysMenuMapper, SysMenu> implements SysMenuService {

    @Autowired
    private SysRoleMenuMapper sysRoleMenuMapper;

    //    菜单列表（树形）
    @Override
    public List<SysMenu> findNodes() {
        //构建树形数据
        List<SysMenu> sysMenuList = baseMapper.selectList(null);
        return MenuHelper.buildTree(sysMenuList);
    }

//    判断是否有子菜单才可删除
    @Override
    public Boolean removeById(Long id) {
        QueryWrapper<SysMenu> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("parent_id",id);
        Integer count = baseMapper.selectCount(queryWrapper);
        if(count>0){
            throw new zzwException(NODE_ERROR.getCode(),NODE_ERROR.getMessage());
        }
        int delete = baseMapper.deleteById(id);

        return delete == 1;
    }

    @Override
    public Boolean removeByIds(List<Long> ids) {
        for (Long id:ids){
            QueryWrapper<SysMenu> queryWrapper=new QueryWrapper<>();
            queryWrapper.eq("parent_id",id);
            Integer count = baseMapper.selectCount(queryWrapper);
            if(count>0){
                throw new zzwException(NODE_ERROR.getCode(),NODE_ERROR.getMessage());
            }

        }
        int deletes = baseMapper.deleteBatchIds(ids);
        System.out.println(deletes);
        return deletes==ids.size();
    }

    @Override
    public Boolean updateStatus(Long id, Integer status) {

        SysMenu sysMenu = baseMapper.selectById(id);
        List<SysMenu> sysMenuList = baseMapper.selectList(null);
        switch (status){
            case 1:
                if(sysMenu.getParentId()!=0 && baseMapper.selectById(sysMenu.getParentId()).getStatus()==0){
                   return false;
                }
                break;
            case 0:
                for (SysMenu node : sysMenuList) {
                    if(sysMenu.getParentId()==0||node.getParentId().equals(sysMenu.getId())){
                        node.setStatus(0);
                        baseMapper.updateById(node);
                    }
                }

                break;
        }
        sysMenu.setStatus(status);
        baseMapper.updateById(sysMenu);
        return true;
    }

    @Override
    public List<SysMenu> findSysMenuByRoleId(Long roleId) {
//        获取所有状态为1的菜单列表
        List<SysMenu> sysMenuList = baseMapper.selectList(new QueryWrapper<SysMenu>().eq("status",1));
//        根据role_id获取角色的菜单id
        QueryWrapper<SysRoleMenu> queryWrapper=new QueryWrapper<SysRoleMenu>();
        queryWrapper.eq("role_id",roleId);
        List<SysRoleMenu> sysRoleMenus = sysRoleMenuMapper.selectList(queryWrapper);
        List<Long> roleMenuIds=new ArrayList<>();
        for (SysRoleMenu roleMenu: sysRoleMenus)
        {
            roleMenuIds.add(roleMenu.getMenuId());
        }
//        判断菜单列表中是否包含角色选择的菜单，并设置select值
        for (SysMenu sysMenu: sysMenuList)
        {
            sysMenu.setSelect(roleMenuIds.contains(sysMenu.getId()));
        }
//         将菜单列表转换为菜单树
        return MenuHelper.buildTree(sysMenuList);
    }

    @Override
    public void doAssign(AssginMenuVo assginMenuVo) {
//        根据role_id先删除原先对应的菜单
        Long roleId = assginMenuVo.getRoleId();
        sysRoleMenuMapper.delete(new QueryWrapper<SysRoleMenu>().eq("role_id",roleId));
        List<Long> menuIdList = assginMenuVo.getMenuIdList();
//        遍历所选中的菜单
        for (Long menuId:menuIdList)
        {
            SysRoleMenu sysRoleMenu=new SysRoleMenu();
            sysRoleMenu.setRoleId(roleId);
            sysRoleMenu.setMenuId(menuId);
//            保存
            sysRoleMenuMapper.insert(sysRoleMenu);
        }

    }

    //        根据用户id获取菜单权限数据
    @Override
    public List<RouterVo> getUserMenuList(Long userId) {

//        admin为超级管理员，其id为1，可以获取所有菜单权限数据
//        判断用户id是否为1
        List<SysMenu> sysMenuList=null;
        if(userId==1){
            QueryWrapper<SysMenu> queryWrapper=new QueryWrapper<>();
//            菜单状态1可用
            queryWrapper.eq("status",1);
//            根据sort_value升序
            queryWrapper.orderByAsc("sort_value");
//            查找所有菜单
            sysMenuList=baseMapper.selectList(queryWrapper);
        }else {
//            其他用户
            sysMenuList=baseMapper.findMenuListByUserId(userId);
        }
//        构建树形结构
        List<SysMenu> sysMenuTreeList = MenuHelper.buildTree(sysMenuList);

//        转换为前端路由要求的格式数据
        List<RouterVo> routerVoList = RouterHelper.buildRouters(sysMenuTreeList);

        return routerVoList;
    }

    //        根据用户id获取按钮权限数据
    @Override
    public List<String> getUserButtonList(Long userId) {

//        admin为超级管理员，其id为1，可以获取所有按钮权限数据
//        判断用户id是否为1
        List<SysMenu> sysMenuList=null;
        if(userId==1) {
            QueryWrapper<SysMenu> queryWrapper = new QueryWrapper<>();
//            菜单状态1可用
            queryWrapper.eq("status", 1);
            sysMenuList = baseMapper.selectList(queryWrapper);
        }else {
//            其他用户
            sysMenuList=baseMapper.findMenuListByUserId(userId);
        }
//        type值1表示菜单栏， 2表示按钮
//        获取按钮
        List<String> premsList=new ArrayList<>();
        for(SysMenu sysMenu:sysMenuList){
            if(sysMenu.getType()==2){
                premsList.add(sysMenu.getPerms());
            }
        }
        return premsList ;
    }

}
